# -*- coding: utf-8 -*-
"""
Created on Thu Nov 25 20:17:17 2021

@author: bwm
"""
import pandas as pd
from find import find
from porfolio import porfolio
from history import history
from strategy import strategy
from output import output
from trade_after import after_trade
###################主模块#######################    
if __name__ == '__main__':
##################导入总数据#####################
    #输入数据路径
    path = "./Python_2020.xlsx"#量价双金叉策略和随机森林策略所用数据
    #path = "./python_etf_6只.xlsx"#ETF轮动策略所用数据
    data_all = find.get_data_all(path)    #到时候写在jupyter里时，这个地方预先导入，运算不会这么慢
    
##################账户初始化#########################
    #量价双金叉策略时间：2020-01-16到2020-11-16
    #ETF轮动策略时间：2017-01-03到2021-11-05
    #随机森林量化策略时间:2020-04-30到2020-07-31
    start_date = '2020-01-16'#回测开始时间
    end_date = '2020-11-16'#回测结束时间
    commission = 0.0005#手续费
    cash = 1000000 #一百万初始资金
    buy_list = data_all[start_date].index.tolist()#获取将要买的股票池，此处默认为导入数据的池子
    
###############创建各个对象#################################    
    my_history = history() ##创建我的历史信息 
    date_all = find.get_date_all(data_all, start_date,end_date)#通过这个函数得到从开始到结束所有交易日的日期
    find = find(data_all, date_all)#定义找数据对象
    me = porfolio(cash,start_date,commission,my_history,find) #创建我的账户
    strategy = strategy(date_all,me,buy_list,find,data_all,start_date)#创建策略对象
    after = after_trade(me,my_history,start_date,find,cash)#创建收盘对象
    output = output(my_history)#创建输出对象
    
###############################################################################
    for date in date_all:#根据日期循环
        ###可选用自己准备用的策略，也可以自定义策略
        
        #strategy.get_strategy_golden_price_num(date)#量价双金叉策略
        #strategy.get_strategy_ETFchange(date)#ETF轮动策略
        strategy.get_strategy_Randomforest(date)#随机森林策略
        
        #策略收盘后，记录每日账户信息、持仓信息、收益率数据，更新今日数据最新股价数据,先分别提出来list再更新了price后组合
        after.after_trade(date) 
######################输出模块##########################################
    print('*'*25,'历史持仓','*'*25)
    print(my_history.hold_history)
    print('*'*25,'历史订单','*'*25)
    order_all = pd.DataFrame(my_history.order_history,columns=['日期','股票','买卖数量','价格','买或卖'])
    print(order_all)
    print('*'*25,'历史收益率','*'*25)
    print(my_history.return_history)
    output.get_plot()#画图，输出一个每日收益率csv文件
    output.get_order_history()#输出一个下单csv文件或者只dataframe
    output.get_hold_histroy()#输出一个每日持仓csv文件或者只dataframe